#pragma once
#include <iostream>
#include <memory>
#include <future>
#include <chrono>
#include <thread>
int add(int x, int y)
{
    return x + y;
}
void text_asyn()
{
    // 异步调用函数
    std::future<int> ret = std::async(std::launch::async, add, 11, 22);
    // 得到结果
    std::cout << ret.get() << std::endl;
}
void text_package_task()
{
    //封装任务
    auto task = std::make_shared<std::packaged_task<int(int, int)>>(add);
    //获取任务包关联的future对象
    std::future<int> res = task->get_future();
    std::thread thr([task](){
        (*task)(11, 22);
    });
    //获取结果
    std::cout << res.get() << std::endl;
    thr.join();
}
void text_promise()
{
    // 在使用的时候，就是先实例化一个指定结果的promise对象，
    std::promise<int> pro;
    // 通过promise对象，获取关联的future对象
    std::future<int> ret = pro.get_future();
    // 在任意位置给promise设置数据，就可以通过关联的future获取到这个设置的数据了
    std::thread thr([&pro](){
        int sum = add(11 , 22);
        pro.set_value(sum);
    });
    std::cout << ret.get() << std::endl;
    thr.join();
}
void test_asyn()
{
    text_asyn();
    text_promise();
}
